/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	TaskNature.java
 * 模块说明：	
 * 修改历史：
 * Jun 15, 2007 - lxm - 创建。
 */
package com.hd123.rumba.runtime.backprocess;

import org.apache.log4j.Logger;

import com.hd123.rumba.domain.IDomain;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.user.IUser;

/**
 * 后台任务性质
 * <p>
 * 
 * 此对象作为一个可执行的后台任务所对应的性质对象。开发人员设计一个后台任务的同时，一般需要定
 * 义其对应的性质对象。应该通过性质对象的扩展属性，将后台处理的参数传递给BackProcess线程对
 * 象。当提交一个后台任务给TaskMgr的时候，需要首先实例化性质对象，并设置需要的传入参数。
 * TaskMgr将会在合适的时候启动对应的BackProcess对象。
 * 
 * @author lxm
 * 
 */
public class TaskNature {

  private static Logger logger = Logger.getLogger(TaskNature.class);
  private Class processClass = null;
  private String caption = "未命名任务";
  private IDomain domain = null;
  private IUser operator = null;

  protected TaskNature() {
    super();
  }

  /**
   * 创建一个TaskNature对象。
   * 
   * @param processClass
   *          指定后台处理类。
   * @return 返回创建的TaskNature对象。
   * @throws BusinessException
   */
  public static TaskNature create(Class processClass, String caption) throws BusinessException {
    TaskNature nature = new TaskNature();
    nature.setProcessClass(processClass);
    nature.caption = caption;
    return nature;
  }

  /**
   * 触发对应的后台处理{@link BackProcess}运行。
   * 
   * @throws BusinessException
   */
  public void trigger() throws BusinessException {
    if (processClass == null)
      throw new BusinessException("属性processClass不可为null。");
    try {
      BackProcess process = (BackProcess) processClass.newInstance();
      process.setNature(this);
      process.setDomain(this.domain);
      process.setOperator(this.operator);
      this.beforeStartProcess(process);
      BackProcessPool.getInstance().put(process);
      process.start();

      logger.debug("触发" + processClass.getName() + "");
    } catch (InstantiationException e) {
      logger.error("", e);
      throw new BusinessException(e);
    } catch (IllegalAccessException e) {
      logger.error("", e);
      throw new BusinessException(e);
    }
  }

  /** 属性：后台处理类。指向真正执行任务的后台处理类。 */
  public Class getProcessClass() {
    return processClass;
  }

  public void setProcessClass(Class processClass) throws BusinessException {
    if (processClass == null)
      throw new BusinessException("指定的参数processClass不可以为null。");
    if (!BackProcess.class.isAssignableFrom(processClass))
      throw new BusinessException("指定的参数processClass必须是" + BackProcess.class.getName() + "的派生类。");
    this.processClass = processClass;
  }

  /**
   * 取得可被用于显示的标题。
   * 
   * @return
   */
  public String getCaption() {
    return this.caption;
  }
  
  protected void setCaption(String caption) {
    this.caption = caption;
  }

  public IDomain getDomain() {
    return domain;
  }

  public void setDomain(IDomain domain) {
    this.domain = domain;
  }

  public IUser getOperator() {
    return operator;
  }

  public void setOperator(IUser operator) {
    this.operator = operator;
  }

  /**
   * 当后台处理类启动前被调用。所谓启动前指的是线程被调用start方法。
   * <p>
   * 
   * 设计该方法提供给派生类进行重写。
   * 
   * @param process
   *          指定将被启动的后台处理类。
   * @throws BusinessException
   */
  protected void beforeStartProcess(BackProcess process) throws BusinessException {
    // Do Nothing
  }

}
